/**
  1. 引用  - 传递一个指向原值的指针，不夺取原变量的所有权 ,典型第用 &var表示
  引用导致了什么问题? 是否违背了所有权的基本原则？ 如果在多线程的情况下，是什么样的
  有个相反的操作称为”解引用"
  1.1 可变引用
  a.也可以创建多个
  b.可变引用可以修改值
  c.但是其值必须在被再次可变引用前使用，否则会报告异常


  问题：在多线程下，是否不可同时使用，例如s,s1.s1借用了s,那么
  如果有主线程使用s,子线程使用s1会发生什么问题了？


  1.2 悬垂引用 -- 并非一种真正的引用，而是一个概念


  1.3

  2. 借
  我们将创建一个引用的行为称为 借（borrowing）

  3.借来的值不可修改（默认），但是存在可变借用
*/

fn main() {
    let name = String::from("岳飞");
    //引用，被引用多少次都无所谓
    print_me(&name);
    print_me(&name);
    let n1 = &name;
    let n2 = &name;
    println!("n1={},n2={}", n1, n2);
    //可变引用可以多次，但应该尽早使用
    mut_borrow();
}

fn print_me(name: &String) {
    println!("我是:{}", name);
}
//不变引用
fn borrow(name: &String) {
    //name.push_str(", world"); // 这么写，那么会编译报错 ,函数也有一些其它标识，以便编译的时候能够执行检查
    name.len(); // 获取属性等操作不会导致修改，所以不会报告编译错误
}
//可变引用语法:  &mut var
fn mut_borrow() {
    let mut s = String::from("飞翔");
    let s1 = &mut s;
    println!("{}", s1);
    s1.push_str("在太空！");
    println!("{}", s1);
    let s2 = &mut s;
    println!("{}", s2);
    //println!("{}",s1); //在已经借给s2的情况下，再使用s1会报错 -- first borrow later used here
    let s3 = &mut s;
    s3.push_str("星光灿烂");
    println!("{}", s3);

    let s4 = &mut s;
    let s5 = &mut s;
    let s6 = &s;
}
